package cn.com.dstz.data.post;

import java.util.LinkedList;


/**
 * 该类暂不使用，由Spring来替代
 * @author 叶装装
 *
 */
public  class ThreadPool extends ThreadGroup{
	
	private boolean isClosed = false;	//	线程池是否关闭
	
	private LinkedList< Runnable > workQueue;	// 工作队列
	
	private static int threadPoolID = 1; 	// 线程池的ID
	
	public ThreadPool( int poolSize ) {
		super( String.valueOf( threadPoolID ) );		// 指定ThreadGroup的名称，必须super( String name )
		setDaemon( true );	// 	设置是否为守护线程
		workQueue = new LinkedList< Runnable >( );	// 创建工作队列
		
		for( int i = 0; i < poolSize; i++ ){
			new WorkThread( i ).start( );
		}
		
		
	}
	
	/**
	 * 向工作队列中加入一个新任务，由工作线程去执行该任务
	 * @param task
	 */
	public synchronized void execute( Runnable task ){
		if( isClosed ){
			throw new IllegalStateException( );
		}
		
		if( task != null ){
			workQueue.add( task );	// 	向队列中添加任务
			notify( );							// 唤醒一个正在getTask()方法中待任务的工作线程
		}
	}
	
	/**
	 * 从工作队列中取出一个任务，工作线程调用此方法
	 * @param threadid
	 * @return
	 * @throws InterruptedException
	 */
	private synchronized Runnable getTask( int threadid ) throws InterruptedException{
		
		while( workQueue.size( ) == 0 ){
			if( isClosed ){
				return null;
			}
			System.out.println( "工作线程" + threadid + "等待任务...");
			wait( );
		}
		
		System.out.println( "工作线程" + threadid + "开始执行任务");
		return workQueue.removeFirst( ); // 返回队列中第一个元素，并删除
	}
	
	/**
	 * 关闭线程池
	 */
	public synchronized void closePool( ){
		if( !isClosed ){
			waitFinish( );
			isClosed = true;
			workQueue.clear( );	//清空队列
			interrupt( );	// 中断线程池的所有工作线程
		}
	}
	
	/**
	 * 等待工作线程把任务执行完毕
	 */
	public void waitFinish( ){
		synchronized( this ){
			isClosed = true;
			notifyAll( );	//唤醒所有还在getTask()方法中等待任务的工作线程的估计值。
		}
		Thread [ ] threads = new Thread[ activeCount( ) ];  ////activeCount() 返回该线程组中活动线程
		
		int count = enumerate( threads );	//enumerate()方法继承自ThreadGroup类，根据活动线程的估计值获得线程组中当前所有活动的工作线程
		
		for( int i = 0; i < count; i++ ){	// 等待所有工作线程结束
			try{
				threads [ i ].join( );			//等待工作线程结束
			}catch( InterruptedException e ){
				e.printStackTrace( );
			}
		}
	}
	
	private class WorkThread extends Thread{
		private int id;
		private WorkThread( int id ){
			super( ThreadPool.this, String.valueOf( id ));
			this.id = id;
		}
		
		@Override
		public void run( ){
			while( !isInterrupted( ) ){ //isInterrupted()方法继承自Thread类，判断线程是否被中断
				Runnable task = null;
				try{
					task = getTask( id );	// 取任务
				}catch( InterruptedException e ){
					e.printStackTrace( );
				}
				
				if( task == null ){
					return;
				}
				
				try{
					task.run( );	// 运行任务
				}catch( Throwable t ){
					t.printStackTrace( );
				}
			}
		}
	}

	
	
	
}
